<?php
namespace app\forum\controller;

use app\BaseController;
use think\facade\Db;
use think\facade\Filesystem;
use think\Validate;

class Index extends BaseController
{
	use \liliuwei\think\Jump;
	// 检查登录状态
	public function check()
	{
		// 如果没有登录，就做出限制
		if (!session('?uNick')) {
			$this->error("请登录后在访问该功能！","user/login");
		}
	}

	public function checkPower()
	{
		if (session('u_power')==1) {
			$this->error("你的账号被禁言，请联系管理员解决问题：admin@sziit.edu.cn！");
		}
	}

	// 查询版块的函数
	public function showSec()
	{
		// 查询版块
		$sec = Db::name("section")
			->where('s_bin',0)
			->field("s_name,s_id")
			->select();
		return $sec;
	}
	// 渲染门户页面
	public function index($sid='0')
	{
		// 查询版块
		$sec = $this->showSec();
		if ($sid==0) {
        // 加载全部帖子
      	//依照时间降序，m_id升序的板块帖子列表
        // 多表查询mes、user
        $mes= Db::view('mes','m_id,m_title,u_nick,m_createat,m_content')
            ->view('user',"u_img","mes.u_nick=user.u_nick")
            -> order('m_createat','desc')
            -> order('m_id')
            ->limit(5)
            ->select();
         }else{
        	//检查sid，如果是错误sid则提示错误
        	$this->checkSid($sid);

        	// 加载某个帖子
        	//依照时间降序，m_id升序的板块帖子列表
        	// 多表查询mes、user
           $mes= Db::view('mes','m_id,m_title,u_nick,m_createat,m_content')
        		->view('user',"u_img","mes.u_nick=user.u_nick")
           		->where('s_id',"=",$sid)
            	->order('m_createat','desc')
            	->order('m_id','desc')
            	->limit(5)
             	->select();
         	}
         	$box=Db::name('box')
        		->field('b_img,b_title,b_createat,b_content,b_aok')
        		->select();
         	$adv=Db::name('adv')
        		->field('a_img,a_aok')
       			->select();
		return view('',['box'=>$box,'adv'=>$adv,'mes'=>$mes,'sec'=>$sec,'sid'=>$sid]);
	}

	// 检查sid的方法
	public function checkSid($sid){
		// 编写链式操作，查询sid是否合法
		$secYes = Db::name("section")
				->where("s_id",$sid)
				->field("s_name")
				->find();
		// 单分支，检查查询结果是否为null，提示跳转
		// 返回版块名字
		return($secYes["s_name"]);
	}

	// 渲染显示帖子列表
	public function view($sid = 0)
	{
		// 查询版块
		$sec = $this->showSec();

		if ($sid == 0) {
			// 加载全部的帖子，查询全部的帖子列表
			// 视图查询
			$mes = Db::view('mes','m_id,m_title,m_createat,u_nick')
				->view('user','u_img','mes.u_nick = user.u_nick')
				->where('mes.m_bin',0)
				->order("m_createat","desc")
				->paginate([
            	'list_rows' => 10,
            	'query' => request()->param()
            ]);
	        $page = $mes->render();
			$thisSec = "全部";
		}
		else{
			// 加载某个版块的帖子
			// 检查sid的值
			$thisSec = $this->checkSid($sid);

			// 查询某个版块的帖子列表
			// 视图查询
			$mes = Db::view('mes','m_id,m_title,m_createat,u_nick')
				->view('user','u_img','mes.u_nick = user.u_nick')
				->where('mes.m_bin',0)
				->where('s_id',$sid)
				->order("m_createat","desc")
				->paginate([
            	'list_rows' => 10,
            	'query' => request()->param()
            ]);
	        $page = $mes->render();
		}

		// 查询s_id为1的版块帖子列表
		// $mes = Db::name("mes")
		// 	->where("s_id",1)
		// 	->order("m_createat","desc")
		// 	// 仅查询帖子的编号、标题、作者和创建时间
		// 	->field('m_id,m_title,u_nick,m_createat')
		// 	->select();

		// 传递参数，渲染模板页面
		return view('',['sec'=>$sec,'mes'=>$mes,'thisSec'=>$thisSec,'page'=>$page]);
	}
	// 2类方法，渲染发帖表单页面
	public function post($sid = 0)
	{
		$this->check();

		if ($sid == 0) {
			$this ->error("全部区域不可发帖，请进入其他区域发帖！");
            exit();
		}else{
			$thisSec = $this->checkSid($sid);
		}
		$sec = $this->showSec();
		return view('',['sec'=>$sec,'thisSec'=>$thisSec]);
	}
	// 1类方法，执行发帖回应
	public function doPost($sid = 0)
	{
		$this->check();
		if ($sid == 0) 
        {
            $this ->error("你访问的页面不存在！");
            exit();
        }
		//准备写入的帖子信息
		$mes = [
			'm_title' => input('mtitle'),
			'm_content' => input('mcontent'),
			'u_nick' => session('uNick'),
			'm_createat' => time(),
			's_id' => input('sid')
		];

		//写入帖子
		// $mesPost = Db::name("mes")
		// 		->insert($mes);
		$mesPost = Db::connect("mysql_fu")
				->name("mes")
				->insert($mes);

		// 判断写入成果
		if($mesPost == 1)
		{
			//成功
			$this->success("发帖成功",url("index/view",["sid"=>input("sid")]));
		}
		else{
			//失败
			$this->error("发帖失败");
		}
	}
	// 注销回应
	public function logout()
	{
		$this->check();
		// 清除session变量的值
		session("uNick",null);
		// 跳转
		$this->success("注销成功！","index/index");
	}

	// 检查mid的值是否合法
	public function checkMid($mid){
		// 检查没有mid的情况
		if ($mid == -1) {
			$this->error("操作有误！","index/index");
			exit();
		}
		// 检查mid是否合法
		$mesYes = Db::name("mes")
				->where("m_id",$mid)
				->field("m_id")
				->find();
		if ($mesYes == null) {
			// mid不合法
			$this->error("查无此贴！","index/view");
			exit();
		}
	}

	// 2类方法，渲染帖子详情
	public function detail($mid = -1,$pageNum = 10)
	{
		// 检查mid
		$this->checkMid($mid);

		// 查询版块
		$sec = $this->showSec();

		// 视图查询，查询的是指定mid的帖子的完整信息
		$mes=Db::view('mes','m_content,m_title,m_id,m_createat,u_nick,m_bin')
            ->view('user','u_img','mes.u_nick = user.u_nick','left')
            ->view('section','s_name','mes.s_id=section.s_id')
            ->where('mes.m_bin',0)
            ->where('m_id',$mid)
            ->find();
        $res=Db::view('res','r_content,r_createat,u_nick,r_bin')
            ->view('user','u_img','res.u_nick = user.u_nick')
            ->where('m_id',$mid)
            ->where('res.r_bin',0)
            ->order('r_createat','desc')
            ->paginate([
            	'list_rows' => $pageNum,
            	'query' => request()->param()
            ]);
        $page = $res->render();
		return view("",['mes'=>$mes,'res'=>$res,'sec'=>$sec,'page'=>$page]);
	}
	// 1类方法，回复帖子
	public function doRes($mid = -1)
	{
		$this->check();
		$this->checkPower();
		// 检查mid
		$this->checkMid($mid);
		$mid=input('mid');
        // echo $mid;
        $content=input('content');
        // echo $content;
        $Res=[
            'r_content'=>$content,
            'u_nick'=>session('uNick'),
            'r_createat'=>time(),
            'm_id'=>$mid
        ];
        $ResAdd=Db::connect('mysql_fu')
                ->name('res')
                ->insert($Res);
        if ($ResAdd==1) {
            $this->success('回帖成功');
        }else{
            $this->error('回帖失败！');
        }
	}

	// 2类方法，渲染用户密码页面
	public function changePa()
	{
		$this->check();
		// 查询版块
		$sec = $this->showSec();
		return view('',['sec'=>$sec]);
	}
	// 执行修改密码
	public function doChangePa()
	{
		$this->check();
		$mes = Db::name("user")
			->field("u_pa")
			->select();
		$newPa = md5(input('newpa'));
		$moPa = Db::connect("mysql_fu")
					->name("user")
					->where('u_nick',session("uNick"))
					->update(["u_pa" => $newPa]);
		if ($moPa == 1) {
			session(null);
			$this->success("密码修改成功，请重新登录！",'user/login');
			
		}else{
			$this->error("密码修改失败！");
		}
	}
	// 2类方法，渲染上传头像的表单页面
	public function me()
	{
		$this->check();
		// 查询版块
		$sec = $this->showSec();
		return view('',['sec'=>$sec]);
	}
	// 1类方法，文件的上传和头像的更新
	public function upMe()
	{
		$this->check();

		// 提取文件域的文件对象
		$file = request()->file('uimg');
		try{
			validate(['img'=>'fileSize:102400|fileExt:jpg,gif,png,jpeg|image'])->check(['img' => $file]);
			$savename = \think\facade\Filesystem::putFile('upload',$file);
		} catch(\think\exception\ValidateException $e){
			$mes = $e->getMessage();
			if ($mes=="上传文件后缀不允许") {
				$this->error("文件上传格式只允许jpg、gif、png、jpeg");
				exit();
			}else{
				$this->error("文件上传大小不得大于100K！");
				exit();
			}
		}
		// 上传文件
		// 返回值格式：upload/20201030\0a806e7118e0091549a7fbdf6f80ee5c.jpg
		$saveName = Filesystem::disk("public")->putFile('upload',$file);
		

		// 存入字段的图片信息，格式：20201030\0a806e7118e0091549a7fbdf6f80ee5c.jpg
		$fileInfo = substr($saveName, 7);
		// 完整的图片路径信息
		$fileName = app()->getRootPath() . 'public/static/forum/'. $saveName;

		// echo $fileName,"<br>";
		// echo $fileInfo;

		if (file_exists($fileName)) {
			# 上传成功
			// 更新记录
			$meUpdate = Db::connect("mysql_fu")
					->name("user")
					->where('u_nick',session("uNick"))
					->update(["u_img" => $fileInfo]);

			if ($meUpdate == 1) {
				# 更新成功，跳转到首页
				// 删除旧头像
				// unlink();
				if (session('uImg')!='me.jpg') {
					$oldimg=app()->getRootPath().'public/static/forum/upload/'. session("uImg");
					unlink($oldimg);
				};	
				session('uImg',$fileInfo);
				$this->success("头像更换成功！","index/index");
			}
			else{
				// 更新失败，跳转到上一页
				$this->error("头像更换失败，请稍后再试！");
			}
		}
		else{
			# 上传失败，跳转到上一页
			$this->error("头像上传失败，请稍后再试！");
		}
	}
}